Microcontrollers can include various modules (e.g., a processor, a memory controller, a display controller, and so on) that communicate with each other using a system bus. A master module initiates bus accesses—read and write operations—on the bus, e.g., by providing address and control information. A slave module responds to read or write operations from master modules. A decoder selects a particular slave module corresponding to an address provided by a master module. In general, only one master module communicates on the bus at any given time. An arbiter manages bus accesses to ensure that only one master module is using the bus. An arbiter can use any of various arbitration schemes (e.g., round robin, time division multiple access (TDMA), and so on.)